<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script type="application/javascript" src='https://kk-karl.github.io/booklog/js/theme-mode.js'></script>
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/frameworks.min.css' />
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/github.min.css' />
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/github-style.css' />
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/light.css' />
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/dark.css' />
    <link rel="stylesheet" href='https://kk-karl.github.io/booklog/css/syntax.css' />
    <title>Posts - mybooklog</title>
    
    <link rel="icon" type="image/x-icon" href='../../../assets/favicon.ico'>
    
    <meta name="theme-color" content="#1e2327">

    
    <meta name="description"
  content="" />
<meta name="keywords"
  content='blog,java,life, google analytics' />
<meta name="robots" content="noodp" />
<link rel="canonical" href="https://kk-karl.github.io/booklog/post/" />


<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="Posts - mybooklog" />
<meta name="twitter:description"
  content="" />
<meta name="twitter:site" content="https://kk-karl.github.io/booklog/" />
<meta name="twitter:creator" content="" />
<meta name="twitter:image"
  content="https://kk-karl.github.io/booklog/">


<meta property="og:type" content="website" />
<meta property="og:title" content="Posts - mybooklog">
<meta property="og:description"
  content="" />
<meta property="og:url" content="https://kk-karl.github.io/booklog/post/" />
<meta property="og:site_name" content="Posts" />
<meta property="og:image"
  content="https://kk-karl.github.io/booklog/">
<meta property="og:image:width" content="2048">
<meta property="og:image:height" content="1024">




<link href="../../../booklog/post/index.xml" rel="alternate" type="application/rss+xml" title="mybooklog" />








</head>

<body>
  <div style="position: relative">
  <header class="Header js-details-container Details px-3 px-md-4 px-lg-5 flex-wrap flex-md-nowrap open Details--on">
    <div class="Header-item mobile-none" style="margin-top: -4px; margin-bottom: -4px;">
      <a class="Header-link" href="https://kk-karl.github.io/booklog/">
        <img class="octicon" height="32" width="32" src="../../../images/github-mark-white.png">
      </a>
    </div>
    <div class="Header-item d-md-none">
      <button class="Header-link btn-link js-details-target" type="button"
        onclick="document.querySelector('#header-search').style.display = document.querySelector('#header-search').style.display == 'none'? 'block': 'none'">
        <img height="24" class="octicon octicon-three-bars" width="24" src="../../../images/github-mark-white.png">
      </button>
    </div>
    <div style="display: none;" id="header-search"
      class="Header-item Header-item--full flex-column flex-md-row width-full flex-order-2 flex-md-order-none mr-0 mr-md-3 mt-3 mt-md-0 Details-content--hidden-not-important d-md-flex">
      <div
        class="Header-search header-search flex-auto js-site-search position-relative flex-self-stretch flex-md-self-auto mb-3 mb-md-0 mr-0 mr-md-3 scoped-search site-scoped-search js-jump-to">
        <div class="position-relative">
          <form target="_blank" action="https://www.google.com/search" accept-charset="UTF-8" method="get"
            autocomplete="off">
            <label
              class="Header-search-label form-control input-sm header-search-wrapper p-0 js-chromeless-input-container header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center">
              <input type="text"
                class="Header-search-input form-control input-sm header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable"
                name="q" value="" placeholder="Search" autocomplete="off">
              <input type="hidden" name="q" value="site:https://kk-karl.github.io/booklog/">
            </label>
          </form>
        </div>
      </div>
    </div>

    <div class="Header-item Header-item--full flex-justify-center d-md-none position-relative">
      <a class="Header-link " href="https://kk-karl.github.io/booklog/">
        <img class="octicon octicon-mark-github v-align-middle" height="32" width="32" src="../../../images/github-mark-white.png">
      </a>
    </div>
    <div class="Header-item" style="margin-right: 0;">
      <a href="javascript:void(0)" class="Header-link no-select" onclick="switchTheme()">
        <svg style="fill: var(--color-profile-color-modes-toggle-moon);" class="no-select" viewBox="0 0 16 16"
          version="1.1" width="16" height="16">
          <path fill-rule="evenodd" clip-rule="evenodd"
            d="M4.52208 7.71754C7.5782 7.71754 10.0557 5.24006 10.0557 2.18394C10.0557 1.93498 10.0392 1.68986 10.0074 1.44961C9.95801 1.07727 10.3495 0.771159 10.6474 0.99992C12.1153 2.12716 13.0615 3.89999 13.0615 5.89383C13.0615 9.29958 10.3006 12.0605 6.89485 12.0605C3.95334 12.0605 1.49286 10.001 0.876728 7.24527C0.794841 6.87902 1.23668 6.65289 1.55321 6.85451C2.41106 7.40095 3.4296 7.71754 4.52208 7.71754Z">
          </path>
        </svg>
      </a>
    </div>
  </header>
</div>

  
<div class="application-main">
  <main>
    


<div class="mt-4 position-sticky top-0 d-none d-md-block bg-white width-full border-bottom color-border-secondary"
  style="z-index:3;">
  <div class="container-xl px-3 px-md-4 px-lg-5">
    <div class="gutter-condensed gutter-lg flex-column flex-md-row d-flex">
      <div class="flex-shrink-0 col-12 col-md-3 mb-4 mb-md-0">
      </div>
      <div class="flex-shrink-0 col-12 col-md-9 mb-4 mb-md-0">
        <div class="UnderlineNav width-full box-shadow-none hx_UnderlineNav-with-profile-color-modes-banner">
          <nav class="UnderlineNav-body">
            <a class="UnderlineNav-item " href="https://kk-karl.github.io/booklog/">
              <svg class="octicon octicon-book UnderlineNav-octicon hide-sm" height="16" viewBox="0 0 16 16"
                version="1.1" width="16">
                <path fill-rule="evenodd"
                  d="M0 1.75A.75.75 0 01.75 1h4.253c1.227 0 2.317.59 3 1.501A3.744 3.744 0 0111.006 1h4.245a.75.75 0 01.75.75v10.5a.75.75 0 01-.75.75h-4.507a2.25 2.25 0 00-1.591.659l-.622.621a.75.75 0 01-1.06 0l-.622-.621A2.25 2.25 0 005.258 13H.75a.75.75 0 01-.75-.75V1.75zm8.755 3a2.25 2.25 0 012.25-2.25H14.5v9h-3.757c-.71 0-1.4.201-1.992.572l.004-7.322zm-1.504 7.324l.004-5.073-.002-2.253A2.25 2.25 0 005.003 2.5H1.5v9h3.757a3.75 3.75 0 011.994.574z">
                </path>
              </svg>
              Overview
            </a>
            <a class="UnderlineNav-item  selected " href="https://kk-karl.github.io/booklog//post/">
              <svg class="octicon octicon-repo UnderlineNav-octicon hide-sm" height="16" viewBox="0 0 16 16"
                version="1.1" width="16">
                <path fill-rule="evenodd"
                  d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z">
                </path>
              </svg>
              Posts
              <span class="Counter">14</span>
            </a>
          </nav>
          <div class="profile-color-modes js-promo-color-modes-banner-profile isInitialToggle">
            <svg width="106" height="60" viewBox="0 0 106 60" fill="none" stroke-width="3" stroke-linecap="round"
              stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
              <g class="profile-color-modes-illu-group profile-color-modes-illu-red">
                <path d="M37.5 58.5V57.5C37.5 49.768 43.768 43.5 51.5 43.5V43.5C59.232 43.5 65.5 49.768 65.5 57.5V58.5">
                </path>
              </g>
              <g class="profile-color-modes-illu-group profile-color-modes-illu-orange">
                <path
                  d="M104.07 58.5C103.401 55.092 97.7635 54.3869 95.5375 57.489C97.4039 54.6411 99.7685 48.8845 94.6889 46.6592C89.4817 44.378 86.1428 50.1604 85.3786 54.1158C85.9519 50.4768 83.7226 43.294 78.219 44.6737C72.7154 46.0534 72.7793 51.3754 74.4992 55.489C74.169 54.7601 72.4917 53.3567 70.5 52.8196">
                </path>
              </g>
              <g class="profile-color-modes-illu-group profile-color-modes-illu-purple">
                <path
                  d="M5.51109 58.5V52.5C5.51109 41.4543 14.4654 32.5 25.5111 32.5C31.4845 32.5 36.8464 35.1188 40.5111 39.2709C40.7212 39.5089 40.9258 39.7521 41.1245 40">
                </path>
                <path d="M27.511 49.5C29.6777 49.5 28.911 49.5 32.511 49.5"></path>
                <path d="M27.511 56.5C29.6776 56.5 26.911 56.5 30.511 56.5"></path>
              </g>
              <g class="profile-color-modes-illu-group profile-color-modes-illu-green">
                <circle cx="5.5" cy="12.5" r="4"></circle>
                <circle cx="18.5" cy="5.5" r="4"></circle>
                <path d="M18.5 9.5L18.5 27.5"></path>
                <path d="M18.5 23.5C6 23.5 5.5 23.6064 5.5 16.5"></path>
              </g>
              <g class="profile-color-modes-illu-group profile-color-modes-illu-blue">
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M40.6983 31.5C40.5387 29.6246 40.6456 28.0199 41.1762 27.2317C42.9939 24.5312 49.7417 26.6027 52.5428 30.2409C54.2551 29.8552 56.0796 29.6619 57.9731 29.6619C59.8169 29.6619 61.5953 29.8452 63.2682 30.211C66.0833 26.5913 72.799 24.5386 74.6117 27.2317C75.6839 28.8246 75.0259 33.7525 73.9345 37.5094C74.2013 37.9848 74.4422 38.4817 74.6555 39">
                  </path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M41.508 31.5C41.6336 31.2259 41.7672 30.9582 41.9085 30.6968C40.7845 26.9182 40.086 21.8512 41.1762 20.2317C42.9939 17.5312 49.7417 19.6027 52.5428 23.2409C54.2551 22.8552 56.0796 22.6619 57.9731 22.6619C59.8169 22.6619 61.5953 22.8452 63.2682 23.211C66.0833 19.5913 72.799 17.5386 74.6117 20.2317C75.6839 21.8246 75.0259 26.7525 73.9345 30.5094C75.1352 32.6488 75.811 35.2229 75.811 38.2283C75.811 38.49 75.8058 38.7472 75.7957 39">
                  </path>
                  <path d="M49.4996 33V35.6757"></path>
                  <path d="M67.3375 33V35.6757"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M41.508 31.5C41.6336 31.2259 41.7672 30.9582 41.9085 30.6968C40.7845 26.9182 40.086 21.8512 41.1762 20.2317C42.9939 17.5312 49.7417 19.6027 52.5428 23.2409C54.2551 22.8552 56.0796 22.6619 57.9731 22.6619C59.8169 22.6619 61.5953 22.8452 63.2682 23.211C66.0833 19.5913 72.799 17.5386 74.6117 20.2317C75.6839 21.8246 75.0259 26.7525 73.9345 30.5094C75.1352 32.6488 75.811 35.2229 75.811 38.2283C75.811 38.49 75.8058 38.7472 75.7957 39">
                  </path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M41.508 31.5C41.6336 31.2259 41.7672 30.9582 41.9085 30.6968C40.7845 26.9182 40.086 21.8512 41.1762 20.2317C42.9939 17.5312 49.7417 19.6027 52.5428 23.2409C54.2551 22.8552 56.0796 22.6619 57.9731 22.6619C59.8169 22.6619 61.5953 22.8452 63.2682 23.211C66.0833 19.5913 72.799 17.5386 74.6117 20.2317C75.6839 21.8246 75.0259 26.7525 73.9345 30.5094C75.1352 32.6488 75.811 35.2229 75.811 38.2283C75.811 38.49 75.8058 38.7472 75.7957 39">
                  </path>
                  <path d="M49.4996 33V35.6757"></path>
                  <path d="M67.3375 33V35.6757"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M41.508 31.5C41.6336 31.2259 41.7672 30.9582 41.9085 30.6968C40.7845 26.9182 40.086 21.8512 41.1762 20.2317C42.9939 17.5312 49.7417 19.6027 52.5428 23.2409C54.2551 22.8552 56.0796 22.6619 57.9731 22.6619C59.8169 22.6619 61.5953 22.8452 63.2682 23.211C66.0833 19.5913 72.799 17.5386 74.6117 20.2317C75.6839 21.8246 75.0259 26.7525 73.9345 30.5094C75.1352 32.6488 75.811 35.2229 75.811 38.2283C75.811 38.49 75.8058 38.7472 75.7957 39">
                  </path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M41.508 31.5C41.6336 31.2259 41.7672 30.9582 41.9085 30.6968C40.7845 26.9182 40.086 21.8512 41.1762 20.2317C42.9939 17.5312 49.7417 19.6027 52.5428 23.2409C54.2551 22.8552 56.0796 22.6619 57.9731 22.6619C59.8169 22.6619 61.5953 22.8452 63.2682 23.211C66.0833 19.5913 72.799 17.5386 74.6117 20.2317C75.6839 21.8246 75.0259 26.7525 73.9345 30.5094C75.1352 32.6488 75.811 35.2229 75.811 38.2283C75.811 38.49 75.8058 38.7472 75.7957 39">
                  </path>
                  <path d="M49.4996 33V35.6757"></path>
                  <path d="M67.3375 33V35.6757"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M73.4999 40.2236C74.9709 38.2049 75.8108 35.5791 75.8108 32.2283C75.8108 29.2229 75.1351 26.6488 73.9344 24.5094C75.0258 20.7525 75.6838 15.8246 74.6116 14.2317C72.7989 11.5386 66.0832 13.5913 63.2681 17.211C61.5952 16.8452 59.8167 16.6619 57.973 16.6619C56.0795 16.6619 54.2549 16.8552 52.5427 17.2409C49.7416 13.6027 42.9938 11.5312 41.176 14.2317C40.0859 15.8512 40.7843 20.9182 41.9084 24.6968C41.003 26.3716 40.4146 28.3065 40.2129 30.5">
                  </path>
                  <path d="M82.9458 30.5471L76.8413 31.657"></path>
                  <path d="M76.2867 34.4319L81.8362 37.7616"></path>
                  <path d="M49.4995 27.8242V30.4999"></path>
                  <path d="M67.3374 27.8242V30.4998"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M45.3697 34.2658C41.8877 32.1376 39.7113 28.6222 39.7113 23.2283C39.7113 20.3101 40.3483 17.7986 41.4845 15.6968C40.3605 11.9182 39.662 6.85125 40.7522 5.23168C42.5699 2.53117 49.3177 4.6027 52.1188 8.24095C53.831 7.85521 55.6556 7.66186 57.5491 7.66186C59.3929 7.66186 61.1713 7.84519 62.8442 8.21095C65.6593 4.59134 72.375 2.5386 74.1877 5.23168C75.2599 6.82461 74.6019 11.7525 73.5105 15.5094C74.7112 17.6488 75.3869 20.2229 75.3869 23.2283C75.3869 28.6222 73.2105 32.1376 69.7285 34.2658C70.8603 35.5363 72.6057 38.3556 73.3076 40">
                  </path>
                  <path d="M49.0747 19.8242V22.4999"></path>
                  <path
                    d="M54.0991 28C54.6651 29.0893 55.7863 30.0812 57.9929 30.0812C59.0642 30.0812 59.8797 29.8461 60.5 29.4788">
                  </path>
                  <path d="M66.9126 19.8242V22.4999"></path>
                  <path d="M33.2533 20.0237L39.0723 22.1767"></path>
                  <path d="M39.1369 25.0058L33.0935 27.3212"></path>
                  <path d="M81.8442 19.022L76.0252 21.1751"></path>
                  <path d="M75.961 24.0041L82.0045 26.3196"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M73.4999 40.2236C74.9709 38.2049 75.8108 35.5791 75.8108 32.2283C75.8108 29.2229 75.1351 26.6488 73.9344 24.5094C75.0258 20.7525 75.6838 15.8246 74.6116 14.2317C72.7989 11.5386 66.0832 13.5913 63.2681 17.211C61.5952 16.8452 59.8167 16.6619 57.973 16.6619C56.0795 16.6619 54.2549 16.8552 52.5427 17.2409C49.7416 13.6027 42.9938 11.5312 41.176 14.2317C40.0859 15.8512 40.7843 20.9182 41.9084 24.6968C41.003 26.3716 40.4146 28.3065 40.2129 30.5">
                  </path>
                  <path d="M82.9458 30.5471L76.8413 31.657"></path>
                  <path d="M76.2867 34.4319L81.8362 37.7616"></path>
                  <path d="M49.4995 27.8242V30.4999"></path>
                  <path d="M67.3374 27.8242V30.4998"></path>
                </g>
                <g class="profile-color-modes-illu-frame">
                  <path
                    d="M40.6983 31.5C40.5387 29.6246 40.6456 28.0199 41.1762 27.2317C42.9939 24.5312 49.7417 26.6027 52.5428 30.2409C54.2551 29.8552 56.0796 29.6619 57.9731 29.6619C59.8169 29.6619 61.5953 29.8452 63.2682 30.211C66.0833 26.5913 72.799 24.5386 74.6117 27.2317C75.6839 28.8246 75.0259 33.7525 73.9345 37.5094C74.2013 37.9848 74.4422 38.4817 74.6555 39">
                  </path>
                </g>
              </g>
            </svg>
            <span class="profile-color-modes-toggle js-promo-color-modes-toggle no-select" tabindex="0"
              onclick="switchTheme()">
              <div class="profile-color-modes-toggle-track no-select"></div>
              <div class="profile-color-modes-toggle-thumb js-promo-color-modes-thumb">
                <svg style="fill: var(--color-profile-color-modes-toggle-moon); margin: 7px 0 0 7px;" width="14"
                  height="13" viewBox="0 0 14 13" xmlns="http://www.w3.org/2000/svg">
                  <path fill-rule="evenodd" clip-rule="evenodd"
                    d="M4.52208 7.71754C7.5782 7.71754 10.0557 5.24006 10.0557 2.18394C10.0557 1.93498 10.0392 1.68986 10.0074 1.44961C9.95801 1.07727 10.3495 0.771159 10.6474 0.99992C12.1153 2.12716 13.0615 3.89999 13.0615 5.89383C13.0615 9.29958 10.3006 12.0605 6.89485 12.0605C3.95334 12.0605 1.49286 10.001 0.876728 7.24527C0.794841 6.87902 1.23668 6.65289 1.55321 6.85451C2.41106 7.40095 3.4296 7.71754 4.52208 7.71754Z">
                  </path>
                </svg>
              </div>
            </span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="container-xl px-3 px-md-4 px-lg-5">
  <div class="gutter-condensed gutter-lg flex-column flex-md-row d-flex">
    <div class="flex-shrink-0 col-12 col-md-3 mb-4 mb-md-0">
      <div class="h-card mt-md-n5" style="margin-top:24px">
        <div class="user-profile-sticky-bar js-user-profile-sticky-bar d-none d-md-block" id="headerStuck">
          <div class="user-profile-mini-vcard d-table">
            <span class="user-profile-mini-avatar d-table-cell v-align-middle lh-condensed-ultra pr-2">
              
              <img class="rounded-1 avatar-user" height="32" width="32" src="../../../images/avatar.png">
              
            </span>
            <span class="d-table-cell v-align-middle lh-condensed">
              <strong>kk-karl</strong>
            </span>
          </div>
        </div>
        <div class="clearfix d-flex d-md-block flex-items-center mb-4 mb-md-0">
          <div class="position-relative d-inline-block col-2 col-md-12 mr-3 mr-md-0 flex-shrink-0" style="z-index:4;">
            
            <a href="../../../images/avatar.png">
              <img style="height:auto;" alt="Avatar" width="260" height="260" id="headerImg"
                class="avatar avatar-user width-full border bg-white" src="../../../images/avatar.png">
            </a>
            
            
            <div class="user-status-container position-relative hide-sm hide-md">
              <div class="f5 user-status-circle-badge-container">
                <div class="user-status-circle-badge d-inline-block lh-condensed-ultra p-2">
                  <div class="d-flex flex-items-center flex-items-stretch">
                    <div class="f6 lh-condensed user-status-header d-inline-flex user-status-emoji-only-header circle">
                      <div class="user-status-emoji-container flex-shrink-0 mr-2 d-flex flex-items-center flex-justify-center ">
                        <div><g-emoji class="g-emoji">😀</g-emoji></div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            
          </div>

          <div
            class="vcard-names-container float-left col-10 col-md-12 pt-1 pt-md-3 pb-1 pb-md-3 js-sticky js-user-profile-sticky-fields"
            data-original-top="0px" style="position: sticky;">
            <h1 class="vcard-names pl-2 pl-md-0">
              <span class="p-name vcard-fullname d-block overflow-hidden">kk-karl</span>
              
              <span class="p-nickname vcard-username d-block">kk-karl</span>
              
            </h1>
          </div>
        </div>

        <div class="p-note user-profile-bio mb-3 js-user-profile-bio f4">
          <div>黑夜给了我黑色的眼睛，我却用它寻找光明</div>
        </div>

        <div class="d-flex flex-column">
          <div class="js-profile-editable-area d-flex flex-column d-md-block">
            <ul class="vcard-details">
              
              <li class="vcard-detail pt-1 css-truncate css-truncate-target hide-sm hide-md">
                <svg class="octicon octicon-location" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M11.536 3.464a5 5 0 010 7.072L8 14.07l-3.536-3.535a5 5 0 117.072-7.072v.001zm1.06 8.132a6.5 6.5 0 10-9.192 0l3.535 3.536a1.5 1.5 0 002.122 0l3.535-3.536zM8 9a2 2 0 100-4 2 2 0 000 4z">
                  </path>
                </svg>
                <span class="p-label">China HeFei</span>
              </li>
              

              
              <li class="vcard-detail pt-1 css-truncate css-truncate-target ">
                <svg class="octicon octicon-mail" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M1.75 2A1.75 1.75 0 000 3.75v.736a.75.75 0 000 .027v7.737C0 13.216.784 14 1.75 14h12.5A1.75 1.75 0 0016 12.25v-8.5A1.75 1.75 0 0014.25 2H1.75zM14.5 4.07v-.32a.25.25 0 00-.25-.25H1.75a.25.25 0 00-.25.25v.32L8 7.88l6.5-3.81zm-13 1.74v6.441c0 .138.112.25.25.25h12.5a.25.25 0 00.25-.25V5.809L8.38 9.397a.75.75 0 01-.76 0L1.5 5.809z">
                  </path>
                </svg>
                <a class="u-email link-gray-dark " href="mailto:zhaoyimin789@126.com">zhaoyimin789@126.com</a>
              </li>
              

              <li class="vcard-detail pt-1 css-truncate css-truncate-target ">
                <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z">
                  </path>
                </svg>
                
                <a rel="nofollow me" class="link-gray-dark" href="https://kk-karl.gitee.io/">https://kk-karl.gitee.io/</a>
                
              </li>
            </ul>
          </div>
        </div>

        <div class="border-top color-border-secondary pt-3 mt-3 clearfix hide-sm hide-md">
          <h2 class="mb-2 h4">Organizations</h2>
          <div style="display:flex;justify-content:flex-start;flex-wrap:wrap;margin-bottom:3px;">
          
          <a style="margin: 0 10px 10px 0;" href="https://github.com/kk-karl">
            <svg id="github-icon" viewBox="0 0 16 16" version="1.1" width="32" height="32" fill="#24292e">
              <path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z">
              </path>
            </svg>
          </a>
          

          
          <a style="margin: 0 10px 10px 0;" href="https://twitter.com/kk-karl">
            <svg  width="32" height="32" viewBox="0 0 1200 1227" fill="none" xmlns="http://www.w3.org/2000/svg">
              <path id="twitter-icon" d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="white"/>
            </svg>
          </a>
          

          
          <a style="margin: 0 10px 10px 0;" href="https://facebook.com/kk-karl">
            <img alt="@facebook" width="32" height="32" src="https://kk-karl.github.io/booklog/images/facebook.png" class="avatar">
          </a>
          

          
          <a style="margin: 0 10px 10px 0;" href="https://linkedin.com/in/kk-karl">
            <img alt="@linkedin" width="32" height="32" src="https://kk-karl.github.io/booklog/images/linkedin.png" class="avatar">
          </a>
          

          
          <a style="margin: 0 10px 10px 0;" href="https://instagram.com/kk-karl">
            <img alt="@instagram" width="32" height="32" src="https://kk-karl.github.io/booklog/images/instagram.png" class="avatar">
          </a>
          

          
          <a style="margin: 0 10px 10px 0;" href="https://kk-karl.tumblr.com/">
            <img alt="@tumblr" width="32" height="32" src="https://kk-karl.github.io/booklog/images/tumblr.png" class="avatar">
          </a>
          

          

          
          
          
          <a style="margin: 0 10px 10px 0;" href="https://kk-karl.gitee.io">
            <img alt="@Link" width="32" height="32" src='https://kk-karl.github.io/booklog/images/link.png' class="avatar">
          </a>
          
          
          
          <a style="margin: 0 10px 10px 0;" href="https://kk-karl.gitee.io">
            <img alt="@Link2" width="32" height="32" src="../../../images/avatar.png" class="avatar">
          </a>
          
          
          

          
          <a style="margin: 0 10px 10px 0;" href="https://kk-karl.github.io/booklog/index.xml">
            <img alt="@rss" width="32" height="32" src="https://kk-karl.github.io/booklog/images/rss.png" class="avatar">
          </a>
          
         </div>
        </div>
      </div>
    </div>

    <div class="flex-shrink-0 col-12 col-md-9 mb-4 mb-md-0">
      

<div class="UnderlineNav user-profile-nav d-block d-md-none position-sticky top-0 pl-3 ml-n3 mr-n3 pr-3 bg-white"
  style="z-index:3;">
  <nav class="UnderlineNav-body">
    <a class="UnderlineNav-item " href="https://kk-karl.github.io/booklog/">
      <svg class="octicon octicon-book UnderlineNav-octicon hide-sm" height="16" viewBox="0 0 16 16" version="1.1"
        width="16">
        <path fill-rule="evenodd"
          d="M0 1.75A.75.75 0 01.75 1h4.253c1.227 0 2.317.59 3 1.501A3.744 3.744 0 0111.006 1h4.245a.75.75 0 01.75.75v10.5a.75.75 0 01-.75.75h-4.507a2.25 2.25 0 00-1.591.659l-.622.621a.75.75 0 01-1.06 0l-.622-.621A2.25 2.25 0 005.258 13H.75a.75.75 0 01-.75-.75V1.75zm8.755 3a2.25 2.25 0 012.25-2.25H14.5v9h-3.757c-.71 0-1.4.201-1.992.572l.004-7.322zm-1.504 7.324l.004-5.073-.002-2.253A2.25 2.25 0 005.003 2.5H1.5v9h3.757a3.75 3.75 0 011.994.574z">
        </path>
      </svg>
      Overview
    </a>
    <a class='UnderlineNav-item   selected '
      href="https://kk-karl.github.io/booklog//post/">
      <svg class="octicon octicon-repo UnderlineNav-octicon hide-sm" height="16" viewBox="0 0 16 16" version="1.1"
        width="16">
        <path fill-rule="evenodd"
          d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z">
        </path>
      </svg>
      Posts
      <span class="Counter ">14</span>
    </a>
  </nav>
</div>

      
      
<div>
  <div class="position-relative">
    <div>
      
        
          <style>
	.tags { padding: 15px 0; }
</style>
<div class="f6 text-gray mt-2 tags border-bottom">
	
	
	
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/go/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		go
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/java/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		java
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/mq/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		mq
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/ssl/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		ssl
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E4%B8%AD%E9%97%B4%E4%BB%B6/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		中间件
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E5%9C%A8%E7%BA%BF%E6%B5%8B%E8%AF%95/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		在线测试
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E5%B0%8F%E8%AF%B4/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		小说
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E5%B7%A5%E5%85%B7/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		工具
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E6%8A%80%E6%9C%AF/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		技术
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E6%96%87%E5%AD%A6/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		文学
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E6%96%87%E7%AB%A0/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		文章
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E7%94%9F%E6%B4%BB/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		生活
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E7%A7%91%E5%AD%A6/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		科学
	</a>
	
	<a class="muted-link mr-3" href="https://kk-karl.github.io/booklog/tags/%E7%BC%96%E7%A8%8B/">

		
		<svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
			<path fill-rule="evenodd"
				d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
			</path>
		</svg>
		
		编程
	</a>
	
	
</div>
        
      
      <ul>
        
        <li class="col-12 d-flex width-full py-4 border-bottom color-border-secondary public source">
          <div class="col-12 d-inline-block">
            <div class="d-inline-block mb-1">
              <h3 class="wb-break-all">
                <a href="https://kk-karl.github.io/booklog/post/myblg04/">SimpleDateFormat的线程安全问题以及四种解决办法</a>
              </h3>
            </div>

            <div>
              <div class="col-12 d-inline-block text-gray mb-2 pr-4">
                SimpleDateFormat的线程安全问题以及四种解决办法 1.多线程环境下SimpleDateFormat的不安全问题: SimpleDateFormat的format方法实际操作的就是Calendar（Calendar变量也就是一个共享变量线程不安全）。
也正是因为每次在转化时间的时候foramat会先把时间set到calendar中，这样就会导致A线程读取到B线程的时间
image
image
我们来试一下： 定义两个全局常量
private static final String myDateStr = &#34;2022-01-01&#34;; private static final SimpleDateFormat dateFormat = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;); //写一个测试方法： private static void test(Callable task) throws Exception { ExecutorService pool = Executors.newFixedThreadPool(10); List&lt;Future&gt; list = new ArrayList&lt;&gt;(); for (int i = 0; i &lt; 10; i++) { Future future = pool.submit(task); list.add(future); } for (Future future : list) { System.out.println(future.get()); } pool.shutdown(); } //开始测试： public static void main(String[] args) throws Exception { test(()-&gt;dateFormat.
              </div>
            </div>

            <div class="f6 text-gray mt-2">
              
              







                 <a class="muted-link mr-3" href="../../../tags/%E6%8A%80%E6%9C%AF">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                技术
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/%E7%94%9F%E6%B4%BB">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                生活
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/java">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                java
              </a>
              
              

              Created
              <relative-time datetime=" Sun, 14 Apr 2024 14:10:45 &#43;0800" class="no-wrap"
                title=" Sun, 14 Apr 2024 14:10:45 &#43;0800">
                Sun, 14 Apr 2024 14:10:45 &#43;0800
              </relative-time>
            </div>
          </div>
        </li>
        
        <li class="col-12 d-flex width-full py-4 border-bottom color-border-secondary public source">
          <div class="col-12 d-inline-block">
            <div class="d-inline-block mb-1">
              <h3 class="wb-break-all">
                <a href="https://kk-karl.github.io/booklog/post/myblg02/">redis限流方案汇总</a>
              </h3>
            </div>

            <div>
              <div class="col-12 d-inline-block text-gray mb-2 pr-4">
                楔子 &ldquo;限流&quot;这种事情即使在生活中也很常见，比如我们银行办理业务，银行不可能给去的所有人同时服务，因为柜台就那么几个。所以可能一次只给5个人办理业务，其他的人只能在后面排队；再比如打饭等等，也是一样的道理。因为能提供服务的数量有限，所以必须要通过限流的方式。
在程序的层面上也是一样的，如果我们的系统只能支持10万人同时在线购物，但是某一天突然来了100万个用户，那么后果显然是服务器直接瘫痪。因此只能让&quot;限流&quot;的功能来维护，先让一部分用户进行购物，其它的人进行排队，这样就等保证整个系统进行运转了。
这里提一下微博，微博因为哪个明星出轨了，或者哪个明星恋爱官宣了，导致服务器挂掉不止一次了。这里也是因为人数骤增导致的，当然这只是表层的原因，关于背后详细的架构、以及为什么这种情况一出现微博就又可能会挂掉的原因，我可能会在其它的系列中说，这里先不谈，今天主要是谈限流。
这里立一个flag，要是哪天所有人都以为还是单身的胡歌在微博上突然官宣：&ldquo;大家好，这是我的妻子xxx，我们昨天领证了，希望得到大家的祝福。&quot;，然后再附带两人结婚照和结婚证，我跟你说微博必瘫痪，话就撂这了。
Redis如何实现限流功能 关于限流所用的算法有两个：漏桶算法、令牌算法。
漏桶算法 漏桶算法的灵感源于漏斗，如下图所示：
首先，如果让你实现一个限流的算法你要怎么做呢？我们可以规定一个时间，比如60s，在60s之内只能处理100个请求，如果超过了100个，那么就将多余的请求丢弃掉。但是这样存在一个问题：如果在10s内请求就已经100个，因此剩余的50s只能把再来的请求给丢弃掉。但是这100个请求又花了10s中就全部处理完了，那么剩余的40s做什么？显然这样做就存在这资源浪费的情况。于是可能有人想到使用队列的方式，设置队列的容量为100，任务处理完了就出队，然后等待处理的入队，这样就保证了资源的利用率，恭喜你，漏桶算法就是这么做的。
说实话从漏斗本身上想，也能猜出使用的是队列，一边进一边出。无论漏斗上面的水流有多少，漏斗下面的水都是均匀流出的。如果上面的水流量大于下面流出的水流量的话，那么漏斗会慢慢变满；反之，漏斗永远不会被装满，并一直流出。
漏桶算法的实现步骤是：先声明一个队列保存请求，这个队列相当于漏斗，当队列容量满了之后，就放弃新来的请求。然后执行的话则是通过声明另一个线程定期从队列中获取一个或多个任务执行，这样就实现了漏桶算法。
漏桶算法可以在编程语言这一层实现。
令牌算法 令牌算法指的是有一个程序以某种恒定的速度生成令牌，并存入令牌桶中，而每个请求需要先获取令牌才能执行，如果没有获取到令牌的话则放弃执行。如下图所示：
这种令牌算法，我们也可以使用Python的threading模块来实现。
更好的限流方案 在Redis4.0，已经为我们实现了限流功能，并提供了原子的限流指令，再加上Redis这个天生的分布式程序就可以完美地实现限流了。
实现限流需要使用Redis提供的Redis-Cell模块，该模块使用的便是漏桶算法，使用起来也很简单，通过cl.throttle即可，但是我们需要提前安装。
前往：https://github.com/brandur/redis-cell/releases下载对应系统的安装包，有源码编译和安装包安装两种方式，源码编译需要rust环境、比较复杂，所以推荐安装包安装。安装之后，直接解压即可，里面会有一个libredis_cell.so文件，执行redis-cli通过module load加载即可。
&gt; cl.throttle mylimit 15 30 60 1）（integer）0 # 0 表示获取成功，1 表示拒绝 2）（integer）15 # 漏斗容量 3）（integer）14 # 漏斗剩余容量 4）（integer）-1 # 被拒绝之后，多长时间之后再试（单位：秒）-1 表示无需重试 5）（integer）2 # 多久之后漏斗完全空出来 其中 15 为漏斗的容量，30 / 60s 为漏斗的速率。
通过Redis-Cell，我们则可以实现分布式原子级别的限流，更详细的使用可以查看官网
              </div>
            </div>

            <div class="f6 text-gray mt-2">
              
              







                 <a class="muted-link mr-3" href="../../../tags/%E6%8A%80%E6%9C%AF">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                技术
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/%E4%B8%AD%E9%97%B4%E4%BB%B6">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                中间件
              </a>
              
              

              Created
              <relative-time datetime=" Sun, 14 Apr 2024 13:47:36 &#43;0800" class="no-wrap"
                title=" Sun, 14 Apr 2024 13:47:36 &#43;0800">
                Sun, 14 Apr 2024 13:47:36 &#43;0800
              </relative-time>
            </div>
          </div>
        </li>
        
        <li class="col-12 d-flex width-full py-4 border-bottom color-border-secondary public source">
          <div class="col-12 d-inline-block">
            <div class="d-inline-block mb-1">
              <h3 class="wb-break-all">
                <a href="https://kk-karl.github.io/booklog/post/myblg03/">RocketMQ学习</a>
              </h3>
            </div>

            <div>
              <div class="col-12 d-inline-block text-gray mb-2 pr-4">
                MQ有什么用 解耦 我觉得从某种角度来说，微服务促进了MQ的蓬勃发展，本来一个系统有N多个模块，所有模块都强耦合在一起，现在微服务了，一个模块就是一个系统，系统之间肯定需要交互，交互有三种常见的方法，一种是RPC，一种是HTTP，一种就是MQ了。
异步 原本一个业务分为N步，要一步一步处理，才能把最终的结果返回给用户，现在有了MQ，先把最关键的部分处理完毕，然后发送消息到MQ，直接返回给用户OK，至于后面的步骤在后台慢慢处理吧，真乃提升用户体验的神器。
削峰 某个接口的请求量突然飙升，势必会对应用服务器、数据库服务器造成很大的压力，现在有了MQ，来多少请求都不在怕的，后台慢慢处理呗。
RocketMQ简介 RocketMQ是用Java编写的，是阿里开源的消息中间件，吸收了Kafka很多优点。Kafka也是比较热门的消息中间件，不过Kafka是用Scala编写的，不利于Java程序员去阅读源码，也不利于Java程序员做一些定制化的开发。接触过Kafka的小伙伴都知道，要用好Kafka实属不易，相对来说，RocketMQ简单多了，而且RocketMQ有阿里加持，经历了N次双11的考验，比较适合国内互联网公司，所以国内使用RocketMQ的公司很多。
RocketMQ四大组件 图片来自https://gitee.com/mirrors/rocketmq/blob/master/docs/cn/architecture.md
可以看到RocketMQ主要有四个组件：
NameServer 无状态服务，注册中心，可集群部署，但是NameServer节点之间没有任何数据交互。 Broker会以定时把Topic路由信息上报给所有的NameServer。Producer、Consumer会随机选择一个NameServer定时Topic更新路由信息。 Topic路由信息在NameServer集群中采用最终一致性。 保证AP。 Broker RocketMQ的服务端，用于存储消息、分发消息。 Broker会定时把自身拥有的所有的Topic路由信息上报给NameServer。 Broker有两个角色：Master、Follower，Master承担读（消费消息）写（生产消息）操作，如果Master比较忙，或者不可用，Follower可以承担读操作。BrokerId=0，代表是Matser，BrokerId!=0，代表是Follower，需要注意的有两点： 其一，目前为止，BrokerId=1的Follower才可以承担读操作； 其二，只有较高版本的RocketMQ才支持当Master节点挂掉，Follower自动升级到Master。 Producer 生产者，每隔一定时间向NameServer发起Topic的路由信息查询。
Consumer 消费者，每隔一定时间向NameServer发起Topic的路由信息查询。
为什么注册中心不选用Zookeeper 其实，在低版本的RocketMQ中，确实是选用Zookeeper作为注册中心的，但是后面改成了现在的NameServer，猜想主要原因是：
RocketMQ已经是一个中间件了，不想再依赖其他中间件。 Zookeeper比较重，有很多功能RocketMQ是用不到的，不如写一个轻量级的注册中心。 Zookeeper是CP，一旦触发领导选举，那么注册中心就不可用了，而RocketMQ的注册中心，不需要强一致性，只要保证最终一致性。 RocketMQ消息领域模型 Message 传输的消息。 消息必须有Topic。 消息可以有多个Tag和多个Key，可以看做消息的附加属性。 Topic 一类消息的集合。 每个消息必须有一个Topic。 消息的第一级类型。 Tag 一个消息除了有Topic之外，还可以有Tag，用来细分同一个Topic下的不同种类的消息。 Tag不是必须的。 消息的第二级类型。 Group 分为ProducerGroup，ConsumerGroup，我们更多的是关注ConsumerGroup，ConsumerGroup包含多个Consumer。
在集群消费模式下，一个ConsumerGroup下的Consumer共同消费一个Topic，且每个Consumer会被分配到N个队列，但是一个队列只会被一个Consumer消费，不同的ConsumerGroup可以消费同一个Topic，一条消息会被订阅此Topic的所有ConsumerGroup消费。
Queue 一个Topic默认包含四个Queue。 在集群消费模式下，同一个ConsumerGroup中的Consumer可以消费多个Queue的消息，但是一个Queue只能被一个Consumer消费。 Queue中的消息是有序的。 分为读Queue和写Queue，一般来说，读Queue的数量和写Queue的数量是一致的，否则很容易出问题。 消费模式 消费模式有两种：Clustering（集群消费）和Broadcasting（广播消费）。
和其他MQ不同，其他MQ是在发送消息的时候，指定是集群消费还是广播消费，RocketMQ是在消费者端设置是集群消费还是广播消费。
Clustering（集群消费） 默认情况下是集群消费模式，该模式下，ConsumerGroup所有的Consumer共同消费一个Topic的消息，每个Consumer负责消费N个队列的消息（N也可能为1，甚至是0，没有分配到队列），但是一个队列只会被一个Consumer消费。如果某个Consumer挂掉，ConsumerGroup下的其他Consumer会接替挂掉的Consumer继续消费。
集群消费模式下，消费进度维护在Broker端，存储路径为${ROCKET_HOME}/store/config/ consumerOffset.json，如下图所示： 使用topicName@consumerGroupName为Key，消费进度为Value，Value的形式是queueId:offset ，说明如果有多个ConsumerGroup，每个ConsumerGroup的消费进度是不同的，需要分开来存储。
Broadcasting（广播消费） 广播消费消息会发给ConsumerGroup中所有的Consumer。
广播消费模式下，消费进度维护在Consumer端。
消费队列负载算法与重平衡机制 消费队列负载算法 我们知道了在集群消费模式下，ConsumerGroup下所有的Consumer共同消费一个Topic的消息，每个Consumer负责消费N个队列的消息，那么具体是如何分配的呢？这就涉及到消费队列负载算法了。
RocketMQ提供了众多的消费队列负载算法，其中最常用的是两种算法，即AllocateMessageQueueAveragely、AllocateMessageQueueAveragelyByCircle。下面我们来看下这两个算法的区别。
假设，现在一个Topic有16个队列，用q0~q15表示，有3个Consumer，用c0-c2表示。
              </div>
            </div>

            <div class="f6 text-gray mt-2">
              
              







                 <a class="muted-link mr-3" href="../../../tags/mq">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                MQ
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/java">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                java
              </a>
              
              

              Created
              <relative-time datetime=" Thu, 11 Apr 2024 13:47:41 &#43;0800" class="no-wrap"
                title=" Thu, 11 Apr 2024 13:47:41 &#43;0800">
                Thu, 11 Apr 2024 13:47:41 &#43;0800
              </relative-time>
            </div>
          </div>
        </li>
        
        <li class="col-12 d-flex width-full py-4 border-bottom color-border-secondary public source">
          <div class="col-12 d-inline-block">
            <div class="d-inline-block mb-1">
              <h3 class="wb-break-all">
                <a href="https://kk-karl.github.io/booklog/post/myblg01/">基于Spring 5.0的响应式编程</a>
              </h3>
            </div>

            <div>
              <div class="col-12 d-inline-block text-gray mb-2 pr-4">
                标题 学习目标 基于Spring 5.0的响应式编程 什么是响应式编程？ 响应式编程是一种编程范式，其核心思想是使用异步数据流来处理数据。它旨在解决传统编程中遇到的并发性和数据流的问题，并且适用于各种应用程序，包括Web应用程序、移动应用程序和IoT设备等。
在响应式编程中，您可以使用Observable对象来表示数据流。这些流可以是无限的，可以被观察者订阅并异步地处理数据。响应式编程强调使用数据流和变换来处理数据，而不是使用显式的控制流语句和变量。
Spring 5.0和响应式编程 Spring 5.0是Spring Framework的一个重要版本，引入了对响应式编程的支持。在Spring 5.0中，您可以使用Reactor项目提供的功能来实现响应式编程。
Reactor是一个基于Java 8的库，提供了一组用于响应式编程的操作符。Reactor操作符可以应用于Flux和Mono对象，这些对象分别表示多个值和单个值的响应式数据流。通过使用Reactor操作符，您可以轻松地将数据流转换为不同的形式，例如过滤数据、转换数据和合并数据流。
Spring 5.0引入了对WebFlux的支持，这是一种基于响应式编程的Web框架。WebFlux允许您使用响应式编程的方式处理Web请求和响应，并且能够提供非常高的并发性能和可伸缩性。
学习响应式编程和Spring 5.0 如果您想学习响应式编程和Spring 5.0，以下是一些资源可以帮助您入门：
Reactor Core官方文档 - Reactor库的官方文档，提供了有关Reactor操作符的详细信息以及如何使用它们来实现响应式编程的示例代码。
Spring Framework官方文档 - Spring Framework的官方文档，提供了有关Spring 5.0和WebFlux的详细信息，以及如何使用它们来实现响应式编程的示例代码。
响应式编程入门指南 - 一篇入门指南，介绍了响应式编程的概念以及如何在Java中实现响应式编程。
[Reactive
Building Reactive RESTful APIs using Spring WebFlux - 一篇教程，介绍了如何使用Spring WebFlux构建响应式的RESTful API。
除此之外，还有许多博客文章、视频教程和在线课程可以帮助您深入了解响应式编程和Spring 5.0的应用。建议您在学习过程中积极尝试实践，并使用Spring Boot创建简单的响应式应用程序。
基于Spring 5.0的响应式编程应用 在实际开发中，您可以使用Spring 5.0的响应式编程功能来构建高性能、高并发的应用程序。以下是一些示例应用：
Web应用程序 - 使用Spring WebFlux和响应式编程来处理Web请求和响应，可以提高Web应用程序的并发性和可伸缩性。 数据流处理 - 使用响应式编程来处理流式数据，例如从消息队列、传感器和其他数据源接收数据。通过使用响应式编程，可以轻松地处理大量的异步数据流。 服务间通信 - 使用Spring Cloud和响应式编程来构建微服务架构，可以实现高效的服务间通信和负载均衡。 总之，Spring 5.0的响应式编程功能可以帮助您构建高性能、高并发的应用程序。建议您在学习和使用响应式编程和Spring 5.0时，保持开放心态和积极探索精神，以获取最佳的开发体验和应用效果。
Spring 5.0的响应式编程的优势和挑战 Spring 5.
              </div>
            </div>

            <div class="f6 text-gray mt-2">
              
              







                 <a class="muted-link mr-3" href="../../../tags/%E6%96%87%E7%AB%A0">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                文章
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/java">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                java
              </a>
              







                 <a class="muted-link mr-3" href="../../../tags/%E6%8A%80%E6%9C%AF">
                
                <svg class="octicon octicon-tag" viewBox="0 0 16 16" version="1.1" width="16" height="16">
                  <path fill-rule="evenodd"
                    d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z">
                  </path>
                </svg>
                技术
              </a>
              
              

              Created
              <relative-time datetime=" Sun, 31 Dec 2023 12:20:34 &#43;0800" class="no-wrap"
                title=" Sun, 31 Dec 2023 12:20:34 &#43;0800">
                Sun, 31 Dec 2023 12:20:34 &#43;0800
              </relative-time>
            </div>
          </div>
        </li>
        
      </ul>
      <div class="paginate-container">
        <div class="BtnGroup">
          


          <a rel="nofollow" class="btn btn-outline BtnGroup-item" href="https://kk-karl.github.io/booklog/post/page/1/">Previous</a>
          
          
          <button class="btn btn-outline BtnGroup-item" disabled="disabled">Next</button>
          
        </div>
      </div>
    </div>
  </div>
</div>

      
    </div>
  </div>
</div>
<script>
window.onscroll = function (e) {
  const headerImg = document.querySelector('#headerImg');
  const headerStuck = document.querySelector('#headerStuck');
  if (headerImg.getBoundingClientRect().bottom <= 0) {
    headerStuck.classList.add('is-stuck');
    if (window.innerWidth >= 1280) {
      headerStuck.setAttribute('style', 'top: 12px;')
    } else {
      headerStuck.setAttribute('style', 'top: 0;')
    }
  } else {
    headerStuck.classList.remove('is-stuck');
  }
};

var style = localStorage.getItem('data-color-mode');
iconElement = document.getElementById('github-icon');
twitterIconElement = document.getElementById('twitter-icon');
if (style == 'light') {
  iconElement.setAttribute('fill', '#24292e');
  twitterIconElement.setAttribute("fill","black")
}
else {
  iconElement.removeAttribute('fill');
  iconElement.setAttribute('class', 'octicon');
  iconElement.setAttribute('color', '#f0f6fc');
  twitterIconElement.setAttribute("fill","white")
}
</script>


    

</div>

  <div class="footer container-xl width-full p-responsive">
  <div
    class="position-relative d-flex flex-row-reverse flex-lg-row flex-wrap flex-lg-nowrap flex-justify-center flex-lg-justify-between flex-sm-items-center pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light ">
    <a aria-label="Homepage" title="GitHub" class="footer-octicon d-none d-lg-block mr-lg-4" href="https://kk-karl.github.io/booklog/">
      <svg height="24" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="24">
        <path fill-rule="evenodd"
          d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z">
        </path>
      </svg>
    </a>
    <ul class="list-style-none d-flex flex-wrap col-12 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0">
      
      <li class="mr-3 mr-lg-0">© 2024-2099 mybooklog</li>
      
    </ul>
  </div>
  <div class="d-flex flex-justify-center pb-6">
    <span class="f6 text-gray-light"></span>
  </div>


</div>
</body>

<script type="application/javascript" src="https://kk-karl.github.io/booklog/js/github-style.js"></script>




</html>